/**
 * 栈：是一种特殊的线性表，它逻辑和存储结构和线性表一样
 * 只是操作受限，只能在表尾进行插入和删除操作，具有先进后出，后进先出的特点，
 * 符合上述特点的都可以采用栈来实现
 * 栈是一种非常重要的数据结构
 */

 /**
  * 顺序栈的特性导致不需要移动数据元素，因此顺序栈的效率很高
  * 但是，顺序栈需要预先分配空间，对于数据元素个数不确定的，可能会导致分配的空间过大/过小
  * 这时可以考虑 链栈
  */

class Stack {
    constructor (length) {
        this.top = -1 // 空栈
        this.data = new Array(length)
    }
    /**
     * 销毁是把数据和分配的空间一起去掉
     */
    destory () {
        this.data = null
        this.top = -1
    }
    /**
     * 分配的空间不动，只清空数据
     */
    clear () {
        this.top = -1
    }
    empty () {
        return this.top <= -1
    }
    full () {
        return this.top === this.data.length - 1
    }
    push (val) {
        let status = 'success'
        if (this.full()) {
            status = 'overflow'
        } else {
            this.top++
            this.data[this.top] = val
        }
    }
    pop () {
        let status = 'success'
        if (this.empty()) {
            status = 'underflow'
        } else {
            status = this.data[this.top]
            this.top--
        }
        return status
    }
    top () {
        let status = 'success'
        if (this.empty) {
            status = 'underflow'
        } else {
            console.log(this.data[this.top])
        }
    }
}
 

module.exports = Stack